package ecom.stateless;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import ecom.api.IAnnonceProprietaireRemote;
import ecom.entity.*;


 @Stateless(mappedName = "ecom.stateless.AnnonceProprietaireStateless@Remote", description = "Annonce Proprietaire stateless", name = "AnnonceProprietaireStateless")
public class AnnonceProprietaireStateless implements IAnnonceProprietaireRemote {

		public AnnonceProprietaireEntity myannonce;
		
	    @PersistenceContext
	    private EntityManager m_EntityManager = null;

	    
	    public void setMyannonce(AnnonceProprietaireEntity annonce){
	  	  this.myannonce = annonce;
	    }

	    public AnnonceProprietaireEntity getMyannonce(){
	  	  return this.myannonce;
	    }
	    
	    
	    public AnnonceProprietaireEntity CreateAnnonceProprietaire(ProprietaireEntity utilisateur, String titre, String texte, String ville, int departement, int surface, int loyer, String photo){
	        myannonce = new AnnonceProprietaireEntity(utilisateur, titre, texte, ville, departement, surface, loyer, photo);
	        m_EntityManager.persist(myannonce);
	        return myannonce;
	      }

	    public AnnonceProprietaireEntity SaveAnnonce(AnnonceProprietaireEntity myannonce){
	        m_EntityManager.merge(myannonce);
	        return myannonce;
	      }


	    public AnnonceProprietaireEntity ModifAnnonceProprietaire(long id, String titre, String texte, String ville, int departement, int surface, int loyer, String photo){
	        myannonce = m_EntityManager.find(AnnonceProprietaireEntity.class, id);
	        myannonce.setTitre(titre);
	        myannonce.setTexte(texte);
	        myannonce.setVille(ville);
	        myannonce.setDepartement(departement);
	        myannonce.setSurface(surface);
	        myannonce.setLoyer(loyer);
	        myannonce.setPhoto(photo);
	        m_EntityManager.merge(myannonce);
	        return myannonce;
	      }
	      
	    public AnnonceProprietaireEntity ModifAnnonceProprietaire(long id, String photo){
	        myannonce = m_EntityManager.find(AnnonceProprietaireEntity.class, id);
	        myannonce.setPhoto(photo);
	        m_EntityManager.merge(myannonce);
	        return myannonce;
	      }
	      
	    public AnnonceProprietaireEntity ActivateAnnonceProprietaire (long id) {
	        myannonce = m_EntityManager.find(AnnonceProprietaireEntity.class, id);
	        if(myannonce.getActive()) {
	        	myannonce.setActive(false);
	        } else {
	        	myannonce.setActive(true);
	        }
	        m_EntityManager.merge(myannonce);
	        return myannonce;
	      }

	    public void DeleteAnnonceProprietaire (long id) {
	    	myannonce = new AnnonceProprietaireEntity();
	    	myannonce.setId(id);
	    	AnnonceProprietaireEntity tmp = m_EntityManager.merge(myannonce);
	    	m_EntityManager.remove(tmp);
	      }

	    public void DeleteFavori (long aid, long cid) {
	    	m_EntityManager.createQuery("DELETE FROM AnnonceProprietaireEntity c JOIN c.chercheurEntityAP p WHERE c.id="+aid+" AND p.id="+cid).executeUpdate();   	
	      }

	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaire(){
			return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true").getResultList();
	    }
	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaire(int departement){
			return m_EntityManager.createQuery("SELECT OBJECT(t) FROM AnnonceProprietaireEntity AS t WHERE t.annonceentity.departement='"+departement+"'").getResultList();
	    }
	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaire(long id){
	    	return m_EntityManager.createQuery("SELECT OBJECT(t) FROM AnnonceProprietaireEntity AS t WHERE t.id='"+id+"'").getResultList();
	    }
	    
	    public List<AnnonceProprietaireEntity> FindMesAnnoncesProprietaire(ProprietaireEntity MonUtilisateur){
			return m_EntityManager.createQuery("SELECT OBJECT(t) FROM AnnonceProprietaireEntity AS t WHERE t.Chercheur_ID='"+MonUtilisateur.getId()+"'").getResultList();
	    }

	    public List<ChercheurEntity> findMesFans(long id) {   	
	    	return m_EntityManager.createQuery("SELECT p FROM AnnonceProprietaireEntity c JOIN c.chercheurEntityAP p WHERE c.id = "+id).getResultList();   	
	    }
		
	    public AnnonceProprietaireEntity FindAnnonceProprietaire(long id){
	    	myannonce = m_EntityManager.find(AnnonceProprietaireEntity.class, id);
	    	myannonce.setChercheurEntityAP(findMesFans(id));
			return myannonce;
	    }
	    
	    public List<AnnonceProprietaireEntity> sortByLoyerAnnonceProprietaireOptFirst()
	    {	    	
	    	return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid = optan.annonceid order by ap.loyer").getResultList();
	    }
	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaireSortedByLoyer(){
			return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true order by t.loyer").getResultList();
	    }
	    
	    
	    public List<AnnonceProprietaireEntity> sortByLoyerAnnonceProprietaireSansOpt()
	    {	    	
	    	//v1 duplicated entries  	
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid <> optan.annonceid order by ap.loyer").getResultList();
	    	
	    	List<AnnonceProprietaireEntity> lsToute = FindAnnoncesProprietaireSortedByLoyer();
	    	List<AnnonceProprietaireEntity> rez  = new ArrayList<AnnonceProprietaireEntity>();
	    	List<AnnonceProprietaireEntity> rezOptFirst = sortByLoyerAnnonceProprietaireOptFirst();
	    	for(AnnonceProprietaireEntity propitem : lsToute )
	    	{
	    		boolean nouveau  = true;
	    		for(AnnonceProprietaireEntity item :rez)
	    		{
	    			
	    			if(propitem.getId()==item.getId()) nouveau = false;
	    			
	    		}
	    		for(AnnonceProprietaireEntity annoncef :rezOptFirst )
	    		{
	    			if(annoncef.getId()==propitem.getId())
	    			{
	    				nouveau = false;
	    			}
	    			
	    		}
	    		
	    		if(nouveau==true)
	    		{
	    			rez.add(propitem);
	    		}
	    	
	    	}
	    	
	    	return rez;
	    	
	    }
	    
	    
	    
	    
	    
	    
	    
	    public List<AnnonceProprietaireEntity> sortByVilleAnnonceProprietaireOptFirst(){
	    	
	    	return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid = optan.annonceid order by annent.ville").getResultList();
	    }
	    
	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaireSortedByVille(){
			return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true order by t.annonceentity.ville").getResultList();
	    }
//	    public List<AnnonceProprietaireEntity> FindAnnoncesProprietaireSortedByVille(){
//			return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true").getResultList();
//	    }
	    
	    public List<AnnonceProprietaireEntity> sortByVilleAnnonceProprietaireSansOpt()
	    {	
	    	//v1 dupliques
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid <> optan.annonceid order by annent.ville").getResultList();
	    	
	    	
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid  not in (  select optan.annonceid from optan join opt.optionPayante optref where optref.id = 1) order by annent.ville").getResultList();
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity, OptionPayante ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid not in (  select optan.annonceid from optan join opt.optionPayante optref where optref.id = 1) order by annent.ville").getResultList();
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt, AnnonceEntity anonent join  ap.annonceentity annent where annent.annonceid=anonent.annonceid join opt.anonce optan where annent.annonceid not in ( select optan.annonceid from optan, OptionPayante optpayante join opt.optionPayante optref where optref.id = 1 ) order by annent.ville)").getResultList();
	    	//return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid <> optan.annonceid order by annent.ville").getResultList();
	    	
	    	List<AnnonceProprietaireEntity> lsToute = FindAnnoncesProprietaireSortedByVille();
	    	List<AnnonceProprietaireEntity> rez  = new ArrayList<AnnonceProprietaireEntity>();
	    	List<AnnonceProprietaireEntity> rezOptFirst = sortByVilleAnnonceProprietaireOptFirst();
	    	for(AnnonceProprietaireEntity propitem : lsToute )
	    	{
	    		boolean nouveau  = true;
	    		for(AnnonceProprietaireEntity item :rez)
	    		{
	    			
	    			if(propitem.getId()==item.getId()) nouveau = false;
	    			
	    		}
	    		for(AnnonceProprietaireEntity annoncef :rezOptFirst )
	    		{
	    			if(annoncef.getId()==propitem.getId())
	    			{
	    				nouveau = false;
	    			}
	    			
	    		}
	    		
	    		if(nouveau==true)
	    		{
	    			rez.add(propitem);
	    		}
	    	
	    	}
	    	
	    	return rez;
	    	
	    	
	    }
	    
	public List<AnnonceProprietaireEntity>   FindAnnoncesProprietaireSortedByDateParution(){
		return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true order by t.annonceentity.date").getResultList();
	}
	    
	public List<AnnonceProprietaireEntity> sortByDateParutionAnnonceProprietaireOptFirst() {
		return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid = optan.annonceid order by annent.date").getResultList();
	}

	public List<AnnonceProprietaireEntity> sortByDatePautionAnnonceProprietaireSansOpt() {
		List<AnnonceProprietaireEntity> lsToute = FindAnnoncesProprietaireSortedByDateParution();
    	List<AnnonceProprietaireEntity> rez  = new ArrayList<AnnonceProprietaireEntity>();
    	List<AnnonceProprietaireEntity> rezOptFirst = sortByDateParutionAnnonceProprietaireOptFirst();
    	for(AnnonceProprietaireEntity propitem : lsToute )
    	{
    		boolean nouveau  = true;
    		for(AnnonceProprietaireEntity item :rez)
    		{
    			
    			if(propitem.getId()==item.getId()) nouveau = false;
    			
    		}
    		for(AnnonceProprietaireEntity annoncef :rezOptFirst )
    		{
    			if(annoncef.getId()==propitem.getId())
    			{
    				nouveau = false;
    			}
    			
    		}
    		
    		if(nouveau==true)
    		{
    			rez.add(propitem);
    		}
    	
    	}
    	
    	return rez;
    	
	}
	    
	    
	public List<AnnonceProprietaireEntity> sortBySurfaceAnnonceProprietaireOptFirst(){
		return m_EntityManager.createQuery("SELECT ap FROM AnnonceProprietaireEntity ap, OptionAchetee opt join ap.annonceentity annent join opt.anonce optan where annent.annonceid = optan.annonceid order by ap.surface").getResultList();
	}
	public List<AnnonceProprietaireEntity> FindAnnoncesProprietaireSortedBySurface()
	{
		return m_EntityManager.createQuery("select t from AnnonceProprietaireEntity t where t.annonceentity.active=true order by t.surface").getResultList();
	}
	public List<AnnonceProprietaireEntity> sortBySurfaceAnnonceProprietaireSansOpt(){
		List<AnnonceProprietaireEntity> lsToute = FindAnnoncesProprietaireSortedBySurface();
    	List<AnnonceProprietaireEntity> rez  = new ArrayList<AnnonceProprietaireEntity>();
    	List<AnnonceProprietaireEntity> rezOptFirst = sortBySurfaceAnnonceProprietaireOptFirst();
    	for(AnnonceProprietaireEntity propitem : lsToute )
    	{
    		boolean nouveau  = true;
    		for(AnnonceProprietaireEntity item :rez)
    		{
    			
    			if(propitem.getId()==item.getId()) nouveau = false;
    			
    		}
    		for(AnnonceProprietaireEntity annoncef :rezOptFirst )
    		{
    			if(annoncef.getId()==propitem.getId())
    			{
    				nouveau = false;
    			}
    			
    		}
    		
    		if(nouveau==true)
    		{
    			rez.add(propitem);
    		}
    	
    	}
    	
    	return rez;
	}
	
	    
}
